//题目:
// 给定一个 完美二叉树 ，其所有叶子节点都在同一层，每个父节点都有两个子节点。二叉树定义如下：
// 填充它的每个 next 指针，让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点，则将 next 指针设置为 NULL。
// 初始状态下，所有 next 指针都被设置为 NULL。
#include<iostream>
#include<queue>
#include<unordered_map>
#include<limits.h>
#include<algorithm>

using namespace std;
//代码
// struct Node {
//   int val;
//   Node *left;
//   Node *right;
//   Node *next;
// };
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
class Solution 
{
public:
    Node* connect(Node* root) 
    {
        queue<Node*> q;
        if(root==nullptr)return root;
        q.push(root);
        while(!q.empty())
        {
            int size=q.size();
            vector<Node*> v;
            for(int i=0;i<size;i++)
            {
                Node* node=q.front();
                q.pop();

                if(node->left)q.push(node->left);
                if(node->right)q.push(node->right);

                v.push_back(node);
            }
            //让v中的所有结点的next指向下一个结点，最后一个结点的next置空
            for(int i=0;i<v.size();i++)
            {
                if(i==v.size()-1) v[i]->next=nullptr;
                else v[i]->next=v[i+1];
            }
        }
        return root;
    }
};